library("terra")
library("ggplot2")
library("rayshader")
options(timeout = 600)Automatyzacja wizualizacji danych
Wizualizacja trójwymiarowa (3D)
Przygotowanie danych
dsm_url = "https://opendata.geoportal.gov.pl/NumDaneWys/NMPT/80271/80271_1539162_N-33-130-D-b-1-4.asc"
rgb_url = "https://opendata.geoportal.gov.pl/ortofotomapa/78957/78957_1246396_N-33-130-D-b-1-4.tif"download.file(dsm_url, "../dane/dsm.tif", mode = "wb")
download.file(rgb_url, "../dane/rgb.tif", mode = "wb")dsm = rast("../dane/dsm.tif")
crs(dsm) = "EPSG:2180"
rgb = rast("../dane/rgb.tif")# docięcie
e = ext(c(357900, 359800, 512400, 514400))
rgb = crop(rgb, e)
dsm = crop(dsm, e)Ryciny dwuwymiarowe
Model terenu
df_dsm = as.data.frame(dsm, xy = TRUE)ggplot() +
geom_raster(data = df_dsm, aes(x = x, y = y, fill = dsm)) +
scale_fill_viridis_c(name = "Wysokość [m n.p.m.]") +
theme_void() +
theme(
aspect.ratio = 1,
legend.position = "bottom"
)Cieniowanie
# transpozycja
elev_matrix = raster_to_matrix(dsm, verbose = FALSE)hillshade = sphere_shade(elev_matrix, texture = "imhof1", sunangle = 315,
zscale = 1)
plot_map(hillshade)shadow = lamb_shade(elev_matrix, sunaltitude = 45, sunangle = 315, zscale = 1)
plot_map(shadow)hillshade |>
add_shadow(shadow) |>
plot_map()RGB
r = raster_to_matrix(rgb[[1]], verbose = FALSE)
g = raster_to_matrix(rgb[[2]], verbose = FALSE)
b = raster_to_matrix(rgb[[3]], verbose = FALSE)# najpierw są kolumny, potem wiersze!
rgb_array = array(0, dim = c(ncol(rgb), nrow(rgb), 3))
rgb_array[,, 1] = r / 255
rgb_array[,, 2] = g / 255
rgb_array[,, 3] = b / 255
rgb_array = aperm(rgb_array, c(2, 1, 3))
plot_map(rgb_array)Ryciny trójwymiarowe
Model terenu
elev_matrix |>
sphere_shade() |>
add_shadow(shadow) |>
plot_3d(elev_matrix, theta = -20, phi = 30, zoom = 1/2)
render_snapshot()Tekstura
plot_3d(rgb_array, elev_matrix, theta = -20, phi = 30, zoom = 1/2)
render_label(elev_matrix, text = "Kampus UAM",
extent = e, long = 358971, lat = 513217,
textcolor = "white", linecolor = "white", textsize = 2, linewidth = 4)
render_snapshot()Animacja
elev_matrix |>
sphere_shade() |>
plot_3d(elev_matrix)
render_movie(filename = "kampus.gif")Zadanie
- Dokonaj wizualizacji średniej wysokości zabudowy wybranego obszaru. Wykorzystaj w tym celu odpowiednie cyfrowe modele wysokościowe oraz obrysy budynków z Geoportalu.
- Wykonaj wizualizację trójwymiarową wybranego obszaru uwzględniając jego teksturę. Uprzednio zapoznaj się z dokumentacją rayshader.